package com.southwind.utils;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * 使用jdk自带的动态代理进行AOP切面编程
 */
public class MyInvocationHandler<T> implements InvocationHandler {

    /**
     * 被代理的目标对象
     */
    private T target;

    public MyInvocationHandler(T target) {
        this.target = target;
    }

    /**
     * 获取被代理的目标对象的代理类
     *
     * @return 被代理的对象的代理类
     */
    public <T> T getProxyTarget() {
        return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        String methodName = method.getName();
        System.out.printf("调用方法[%s]前，参数为:%s%n", methodName, Arrays.toString(args));
        Object result = method.invoke(target, args);
        System.out.printf("调用方法[%s]后，结果为:%s%n", methodName, result);
        return result;
    }
}
